------------------------------------------------------------------------------------
-- base/settings.lua
--
-- 本模块提供了一些通用的配置选项，包括日志级别、超时设置、调试器设置等。
--
-- @module      settings
-- @author      admin
-- @license     MIT
-- @release     v1.0.0 - 2023-03-22
-- @copyright   2023
-- @usage
-- -- 日志级别
-- -- 0 代表 trace 级别，最低的调试级别。
-- -- 1 代表 debug 级别，用于输出一些比较详细的调试信息。
-- -- 2 代表 info 级别，一般用于输出程序运行的关键信息。
-- -- 3 代表 warn 级别，表示程序运行遇到了一些警告。
-- -- 4 代表 error 级别，表示程序运行出现了一些错误，但不会导致程序崩溃。
-- -- 5 代表 critical 级别，表示程序运行遇到了严重错误，可能导致程序崩溃或者无法继续运
-- -- 日志通道
-- -- 1 代表 调试器
-- -- 2 代表 日志文件
-- -- 3 代表 调试器和日志文件
-- @usage
-- -- 设置方法
-- settings.log_level = 0
-- settings.log_type_channel = 3
------------------------------------------------------------------------------------

-- 模块定义
---@class settings
local settings = {
    -- 模块版本，使用主版本.次版本.修订版本的格式
    VERSION = '1.0.0',

    -- 作者备注，包括更新日期和更新内容的简要描述
    AUTHOR_NOTE = '2023-03-22 - Initial release',

    -- 模块名称
    MODULE_NAME = 'settings module',

    -- 只读模式，设置为true表示设置不可更改，false表示可更改
    READ_ONLY = false,

    -- 调试模式开关，设置为true开启调试模式，false关闭
    debug_mode = true,

    -- 日志记录级别，指定记录信息的详细程度（0=trace, 1=debug, 2=info, 3=warn, 4=error, 5=critical）
    -- settings.log_level = 0
    log_level = 2,

    -- 日志类型记录的通道，指定日志输出的目的地（1=调试器, 2=日志文件, 3=两者）
    -- settings.log_type_channel = 3
    log_type_channel = 3,

    -- 异常后继续运行脚本，设置为true允许脚本在遇到异常后继续执行，false则停止
    -- settings.continue_on_error = true
    continue_on_error = false,

    -- 行为函数运行失败暂停脚本运行，设置为true时在函数失败后暂停脚本
    -- settings.halt_on_failure = true
    halt_on_failure = true,

    -- 调度轮巡函数的间隔运行时间，以秒为单位，默认设置为每10秒执行一次
    -- settings.scheduled_monitor_interval = 20
    scheduled_monitor_interval = 5,

    -- 全局轮巡函数的间隔运行时间，以秒为单位，默认设置为每15秒执行一次
    -- settings.global_monitor_interval = 30
    global_monitor_interval = 15,

    -- 局部轮巡函数的间隔运行时间，以秒为单位，默认设置为每5秒执行一次
    -- settings.local_monitor_interval = 10
    local_monitor_interval = 5,

    -- 行为函数操作后等待时间, 默认15秒（单位：毫秒）
    delay_after_action_ms = 15 * 1000,
}

-- 模块实例
local this = settings

------------------------------------------------------------------------------------
-- 将对象转换为字符串
--
-- @local
-- @treturn      string                     模块名称
------------------------------------------------------------------------------------
function settings.__tostring()
    return this.MODULE_NAME
end

------------------------------------------------------------------------------------
-- 防止动态修改(this.READ_ONLY值控制)
--
-- @local
-- @tparam       table     t                被修改的表
-- @tparam       any       k                要修改的键
-- @tparam       any       v                要修改的值
------------------------------------------------------------------------------------
function settings.__newindex(t, k, v)
    if this.READ_ONLY then
        xxxmsg(5, 'attempt to modify read-only table')
        return
    end
    rawset(t, k, v)
end

------------------------------------------------------------------------------------
-- 设置settings的__index元方法指向自身
--
-- @local
------------------------------------------------------------------------------------
settings.__index = settings

------------------------------------------------------------------------------------
-- 创建一个新的实例
--
-- @local
-- @tparam       table     args             可选参数，用于初始化新实例
-- @treturn      table                      新创建的实例
------------------------------------------------------------------------------------
function settings:new(args)
    local new = {}
    -- 预载函数(重载脚本时)
    if this.super_preload then
        this.super_preload()
    end
    -- 将args中的键值对复制到新实例中
    if args then
        for key, val in pairs(args) do
            new[key] = val
        end
    end
    -- 设置元表
    return setmetatable(new, settings)
end

-------------------------------------------------------------------------------------
-- 返回实例对象
-------------------------------------------------------------------------------------
return settings:new()

-------------------------------------------------------------------------------------
